/**
 * @file 右键菜单辅助工具
 * @description 为渲染进程提供便捷的右键菜单使用方法，包装底层的_pre_.contextMenuAPI
 * @author 黄敏
 * @version 1.0.0
 * @since 2025-07-03
 */

import type {
  ContextMenuItemWithFn as CtxItemWithFn,
  MenuDisplayOptions
} from '~shared/types/context-menu'

import { svgPathToImageDataCached } from './svgToImage'

/**
 * 简化的菜单项接口
 */
export interface SimpleMenuItem {
  /** 菜单项标签 */
  label?: string
  /** 点击回调函数 */
  cb?: () => void
  /** 菜单项图标（可选） */
  icon?: string
  /** 菜单项类型 */
  type?: 'normal' | 'separator' | 'submenu' | 'checkbox' | 'radio'
  /** 是否启用（默认为true） */
  enabled?: boolean
  /** 是否可见（默认为true） */
  visible?: boolean
  /** 子菜单项（仅对submenu类型有效） */
  submenu?: SimpleMenuItem[]
}

/**
 * 预处理菜单项，将SVG图标转换为图片数据
 * @param menuItems - 菜单项数组
 * @returns Promise<ContextMenuItem[]> - 处理后的菜单项数组
 */
async function preprocessMenuItems(menuItems: CtxItemWithFn[]): Promise<CtxItemWithFn[]> {
  const processedItems: CtxItemWithFn[] = []

  for (const item of menuItems) {
    const processedItem: CtxItemWithFn = { ...item }
    const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
    // 处理SVG图标
    if (
      item.icon &&
      (item.icon.startsWith('M') || item.icon.includes('L') || item.icon.includes('Z'))
    ) {
      try {
        const imageData = await svgPathToImageDataCached(
          item.icon,
          16,
          isDarkMode ? '#DDDDDD' : '#444444'
        )
        if (imageData) {
          processedItem.icon = imageData
        } else {
          delete processedItem.icon
        }
      } catch (error) {
        delete processedItem.icon
        console.error('Error processing SVG icon:', error)
      }
    }

    // 递归处理子菜单
    if (item.submenu && item.submenu.length > 0) {
      processedItem.submenu = await preprocessMenuItems(item.submenu)
    }

    processedItems.push(processedItem)
  }

  return processedItems
}

/**
 * 显示右键菜单
 * @param menuItems - 菜单项数组
 * @param options - 可选配置
 */
export async function showContextMenu(
  menuItems: (SimpleMenuItem | false | undefined)[],
  options?: MenuDisplayOptions
): Promise<void> {
  // 递归转换菜单项
  function convertMenuItem(item: SimpleMenuItem): CtxItemWithFn {
    const converted: CtxItemWithFn = {
      label: item.label,
      icon: item.icon,
      type: item.type,
      enabled: item.enabled,
      visible: item.visible,
      click: item.cb
    }

    // 递归处理子菜单
    if (item.submenu && item.submenu.length > 0) {
      converted.submenu = item.submenu.map(convertMenuItem)
    }

    return converted
  }

  // 将简化的菜单项转换为完整的ContextMenuItem格式
  const contextMenuItems: CtxItemWithFn[] = (menuItems.filter(Boolean) as SimpleMenuItem[]).map(
    convertMenuItem
  )

  // 预处理菜单项，转换SVG图标
  const processedItems = await preprocessMenuItems(contextMenuItems)

  // 调用底层的_pre_.contextMenuAPI
  return _pre_.contextMenu.show(processedItems, options)
}
